# 实现统计日活跃用户数的接口
from django.utils import timezone
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.views import APIView
from apps.users.models import User


class UserDayActiveView(APIView):
    """
    请求方式：GET /meiduo_admin/statistical/day_active/
    请求参数：通过请求头传递jwt token数据
    返回数据：JSON
    {
        "count": "活跃用户数量",
        "date": "年-月-日"
    }
    """
    # 仅管理员才能进行访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
        获取网站日活跃用户量:
        1. 查询数据库统计当日活跃用户量
        2. 返回响应数据
        count int 活跃用户量
        date date 日期
        """
        # 1.查询数据库统计当日活跃用户量
        now_date = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        count = User.objects.filter(last_login__gte=now_date).count()

        # 2.返回响应数据
        # response_data = {
        #     "count": "活跃用户数量",
        #     "date": "年-月-日"
        # }
        response_data = {
            "count": count,
            "date": now_date.date()
        }
        return Response(response_data)


class UserDayOrdersView(APIView):
    """
    请求方式： GET /meiduo_admin/statistical/day_orders/
    请求参数： 通过请求头传递jwt token数据。
    返回数据： JSON
    {
        "count": "下单用户量",
        "date": "年-月-日"
    }
    """
    # 仅管理员才能进行访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
        获取日下单用户数量：
        1. 获取日下单用户数量
        2. 返回应答
        """
        # 1. 获取日下单用户数量
        now_date =timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        # distinct进行去重是因为可能同一个用户当天下多个订单
        count = User.objects.filter(orderinfo__create_time__gte=now_date).distinct().count()

        # 2. 返回应答
        response_data = {
            'date': now_date.date(),
            'count': count
        }

        return Response(response_data)


class UserMonthIncrementView(APIView):
    """
    请求方式： GET /meiduo_admin/statistical/month_increment/
    请求参数： 通过请求头传递jwt token数据。
    返回数据： JSON
    [
        {
            "count": "当日新增用户量",
            "date": "年-月-日"
        },
        {
            "count": "当日新增用户量",
            "date": "年-月-日"
        },
        ...
    ]
    """
    # 仅管理员才能进行访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
        近30天每日新增用户数统计：
        ① 查询数据库统计近30天每日新增用户数量
        ② 返回统计结果
        """
        # ① 查询数据库统计近30天每日新增用户数量
        # 结束时间
        end_date = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        # 起始时间：结束时间 - 29天
        begin_date = end_date - timezone.timedelta(days=29)

        # 当天日期
        current_date = begin_date

        # 保存结果的list(新增用户的数量)
        month_li = []

        while current_date <= end_date:
            # 第二天时间
            next_date = current_date + timezone.timedelta(days=1)

            # 统计current_date这一天的新增用户数据
            count = User.objects.filter(date_joined__gte=current_date,
                                        date_joined__lt=next_date).count()

            month_li.append({
                'count': count,
                'date': current_date.date()
            })

            # current_date + 1天
            current_date = next_date
            # 或
            # current_date += timezone.timedelta(days=1)

        # ② 返回统计结果
        return Response(month_li)
